package main

import (
	"fmt"
	"io"
	"log"
	"os"
	"strconv"
	"strings"
)

/*
	seek(offset,int64,whence int)(int64,error) 设置光标位置
	第一个参数:偏移量
	第二个参数：如何设置

*/
/*
断点续传(本质是文件的复制): 当文件过大，且在传递中出现被中断时，以及可以支持文件的暂停和恢复时，可以采用断点续传方法
*/
// seek()指定光标位置
func seek() {
	src := "D:\\go\\src\\code.oldboyedu.com\\studygo\\day05\\08文件操作\\1.txt"
	file, err := os.OpenFile(src, os.O_RDWR, os.ModePerm)
	if err != nil {
		fmt.Printf("open file failed,err：%v\n", err)
		return
	}
	defer file.Close()
	readfile := []byte{1}
	file.Read(readfile)
	fmt.Println(string(readfile))

	file.Seek(4, io.SeekStart) //设置光标起始位置，在第4个字节
	file.Read(readfile)
	fmt.Println(string(readfile))

	file.Seek(4, 0) //设置光标起始位置，在第4个字节
	file.Read(readfile)
	fmt.Println(string(readfile))
	file.Seek(6, io.SeekCurrent)
	file.Read(readfile)
	fmt.Println(string(readfile))

	file.Seek(0, io.SeekEnd) //设置光标末尾位置，在最后
	file.WriteString("ABCV")
	file.Read(readfile)
	fmt.Println(string(readfile))
}

// 断点续传(思路:边复制边记录复制的总量)
func Handler(err error) {
	if err != nil {
		log.Fatal(err)
	}
}
func ddxc() {
	srcFile := "D:\\从入门到放弃\\nginx\\city-nginx-1.16.2-1.x86_64.rpm"
	destFile := srcFile[strings.LastIndex(srcFile, "\\")+1:] //以\\为分隔符，取出源文件最后一个文件名
	fmt.Println(destFile)
	tempFile := destFile + "temp.file" //定义临时文件格式
	fmt.Println(tempFile)
	file1, err := os.Open(srcFile) //源文件
	Handler(err)
	file2, err := os.OpenFile(destFile, os.O_CREATE|os.O_WRONLY, os.ModePerm) //最终的目标文件
	Handler(err)
	file3, err := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, os.ModePerm) //存储临时文件
	Handler(err)

	defer file1.Close()
	defer file2.Close()
	defer file3.Close()
	//	1.先读取临时文件的数据，在Seek()
	file3.Seek(0, io.SeekStart)
	bs := make([]byte, 1024)
	n1, err := file3.Read(bs)
	//Handler(err)
	countStr := string(bs[:n1])
	count, err := strconv.ParseInt(countStr, 10, 64) //strconv包 是字符串和基本类型之间的转换 此处是将字符串类型解析为Int类型（强制转换）
	//Handler(err)
	fmt.Println(count)
	//	2.设置读写的位置
	file1.Seek(count, io.SeekStart)
	file2.Seek(count, io.SeekStart)
	data := make([]byte, 2048)
	n2 := -1
	n3 := -1
	total := int(count)
	//	3.复制文件
	for {
		n2, err = file1.Read(data)
		if err == io.EOF || n2 == 0 {
			fmt.Printf("文件复制完毕", total)
			file3.Close()
			os.Remove(tempFile)
			break
		}
		n3, err = file2.Write(data[:n2])
		total += n3
		//	将复制的总量，存储到临时文件中
		file3.Seek(0, io.SeekStart)
		file3.WriteString(strconv.Itoa(total)) //strcove.Itoa将int转为字符串类型
		fmt.Printf("total:%d\n", total)

		//	4.模拟断点续传
		//if total > 4000 {
		//	panic("传递被中断了")
		//}
	}
}
func main() {
	seek()
	ddxc()
}
